package cn.sc.summer.mybatis.config;

import cn.hutool.core.util.ObjectUtil;
import cn.sc.summer.mybatis.scan.TenantScanner;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import cn.sc.summer.constant.mybatisplus.TenantInfo;
import cn.sc.summer.constant.mybatisplus.context.TenantContextHolder;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;

import java.util.List;

/**
 * 多租户设置
 *
 * @Author a-xin
 * @Date 2023/3/24 10:11
 */
@Slf4j
public class TenantConfig extends TenantLineInnerInterceptor {

    /**
     * 多租户初始化设置
     *
     * @param ignoreTable 忽略的表
     */
    public TenantConfig(final List<String> ignoreTable, final String idName) {
        super(new TenantLineHandler() {
            /**
             * 获取租户id
             * @return 租户信息
             */
            @Override
            public Expression getTenantId() {
                try {
                    TenantInfo tenantInfo = TenantContextHolder.getTenantInfo();
                    return new StringValue(tenantInfo.getTenantId());
                } catch (Exception e) {
                    throw new RuntimeException(e.getMessage(), e);
                }
            }

            /**
             * 忽略表,true表示忽略该表
             * @param tableName 表名
             * @return 是否忽略租户
             */
            @Override
            public boolean ignoreTable(String tableName) {
                TenantInfo tenantInfo = TenantContextHolder.getTenantInfo();
                //校验当前线程是否忽略租户信息
                if (ObjectUtil.isNull(tenantInfo) || tenantInfo.getIgnoreTenant()) {
                    return true;
                }
                //如果该表存在租户字段，则不忽略租户查询
                if (TenantScanner.IGNORE_TENANT_TABLE.contains(tableName)) {
                    return false;
                }
                //校验忽略租户的表是否存在当前表
                return ignoreTable.contains(tableName);
            }

            /**
             * 多租户的列名自定义
             * @return 租户列名称
             */
            @Override
            public String getTenantIdColumn() {
                return idName;
            }
        });
    }
}
